#※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
# File Name: core.sh
# Author: GID5564
# Description:
# Created Time: 05/11/23-19:43:37
#※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
#! /usr/bin/env bash

# 避免重复导入
#[[ -n $__XLIB_IMPORTED__CORE ]] && return 0
#__XLIB_IMPORTED__CORE=1

export XLIB_CORE=${BASH_SOURCE[0]:-$0}
function __core_init__(){
    #♦工作目录
    ##当前脚本路径目录
    export XLIB_PATH=$(cd "$(dirname "${XLIB_CORE}")" &>/dev/null && pwd -P)
    ##当前脚本路径目录的父目录，即脚本根目录
    export XSHELL_PATH="${XLIB_PATH%/*}"
    
    export BIN_PATH="${XSHELL_PATH}/boot"

    export DATA_PATH="${XSHELL_PATH}/data"
    export PYLIB_PATH="${XSHELL_PATH}/pylib"
    export LOG_PATH="${DATA_PATH}/log"
    export FONT_PATH="${DATA_PATH}/fonts"
    export DYNAMIC_PATH=${BIN_PATH}'/items'
    #所有配置文件主目录
    export CONFIG_PATH="${XSHELL_PATH%/*}/config"
    #配置文件
    export FILE_CONFIG="${CONFIG_PATH}/.config"

    #获取最初始的$PATH
    export XLIB_ORIGIN_PATH="$PATH" 

    #♦初始化虚拟环境变量
    #虚拟环境数量
    export ENV_SUM=0
    #环境名数组
    export ARRAY_ENVS=()
    #当前环境名
    export CUR_ENV=""
    
    
    #♦其它变量
    
    #窗口行列数
    export WINDOW_ROWS=`tput lines` 
    export WINDOW_COLS=`tput cols`  
    
    #清华源
    export MODE_SOURCE="https://pypi.tuna.tsinghua.edu.cn/simple "

    #执行函数
    __define_error_codes__ #错误代码
    __global_variable__ #全局变量

    # 添加基础路径到PATH
    PATH::add $XLIB_PATH
    PATH::add $BIN_PATH
}

function _enable_(){
    #启用/禁用文件中的日志记录。(no/yes)
    export LOG_ENABLED="no"
    #启用/禁用Syslog日志记录。(no/yes)
    export SYSLOG_ENABLED="no"
    #调试模式(no/yes)
    export DEBUG="yes"
}

function __global_variable__(){
    # 设置变量默认值
    # -r,只读
    # -x,选项表示将变量导出为环境变量，使其在子进程中可用
    
    #版本号
    export LIB_VERSION="0.1.0"

    export __STDIN="/dev/stdin"
    export __NULL=" >/dev/null"
    export __STDERR="/dev/stderr"
}

# 定义常用错误码 0~255
function __define_error_codes__() {
    # 基础错误码（遵循Unix惯例）
    declare -gi GENERIC_NORMAL=0          # 正常退出
    declare -gi GENERIC_ERROR=1           # 通用错误
    declare -gi NOT_SUPPORTED=2           # 功能不支持
    declare -gi UNABLE_TO_EXECUTE=126     # 权限不足无法执行
    declare -gi COMMAND_NOT_FOUND=127      # 命令未找到

    # 函数调用相关错误
    declare -gi INVALID_ARGUMENTS=130     # 无效参数
    declare -gi IMPORT_LIB_FAILURE=131    # 导入库失败
    declare -gi INVALID_BASH_VERSION=132  # Bash版本不兼容

    # 字符串操作错误
    declare -gi STRING_REGX_NOT_MATCH=150 # 正则匹配失败
    declare -gi STRING_NOT_EQUAL=151      # 字符串不相等

    # 文件系统错误
    declare -gi FILE_NOT_FOUND=100        # 文件不存在
    declare -gi FILE_NOT_EXECUTABLE=101   # 文件不可执行
    declare -gi FILE_CREATE_FAILURE=102   # 文件创建失败

    # 路径相关错误
    declare -gi PATH_NOT_FOUND=220        # 路径搜索失败
}


##**********************************
#字符串首字母大写
function _capitalize_first_letter() {
    local input="$1"
    local first_char=$(echo ${input:0:1} | tr '[:lower:]' '[:upper:]')
    local rest="${input:1}"
    echo "${first_char}${rest}"
}


function _contains_() {
    local input_string="$1"
    local char=${2:-'/'}
    # 使用case语句查找字符串中的'/'字符
    case "${input_string}" in
        *"${char}"*) return 0;;
        *) return 1;;
    esac
}


#♦文件导入和重载
function import() {
    [[ -z "$1" ]] && {
        error "Usage: import <sh文件名>"
        return $INVALID_ARGUMENTS
    }
    local lib1="${XLIB_PATH}/$1.sh"
    local lib2="${BIN_PATH}/$1.sh"
    
    if [[ ${DEBUG} == "y" ]] || [[ ${DEBUG} == "yes" ]];then
        if _contains_ "$1";then
            local fname=${1##*/}
        else
            local fname=${1}
        fi

        local cfl=$(_capitalize_first_letter ${fname})
        echo "${RED}${cfl}${RESET} ${BLUE}Lib Loading${RESET} ……"
    fi
    
    # -e:文件存在， -s:文件存在且不为空
    if [[ -s $lib1 ]]; then
        source "$lib1"
        return $GENERIC_NORMAL
    elif [[ -s $lib2 ]];then
        source "$lib2"
        return $GENERIC_NORMAL
    else
        error "导入文件 $1.sh 失败!"
        return $IMPORT_LIB_FAILURE
    fi
    unset lib1
    unset lib2
}



# xxx: 文件名称，需要在该sh中设置 __LIB_IMORTED_XXX
function reload() {
    [[ -z "$@" ]] && {
        error "Usage: reload <文件名列表>"
        return $INVALID_ARGUMENTS
    }

    for file in "$@"; do
        local capi=$(echo $file | awk '{print toupper($0)}')

        local var_name="__XLIB_IMPORTED__${capi}"
        unset ${var_name}
        import "$file"
        unset file
        unset capi
    done
}

#导入目录中的sh文件
function __reload__(){
    [[ -z "$1" ]] && {
        error "Usage: __reload__ <dir-path>"
        return $INVALID_ARGUMENTS
    }
    [[ -d "$1" ]] && {
        error "Invalid directory: $1"
        return $INVALID_ARGUMENTS
    }
    local f_path=$1
    for file in $(find ${f_path} -name "*.sh" -type f)
    do
        local file_name=${file##*/}
        file_name=${file_name%.*}
        import $file_name
        echo "import ${file_name}"
        unset file_name
    done
}


# 从当前shell中移除引入的函数和变量
function unload() {
    [[ -z "$@" ]] && {
        error "Usage: unload <文件名>"
        return $INVALID_ARGUMENTS
    }

    local lib=$1
    [[ -s $lib ]] && {
        warn "unload $lib"
        unset -f "$lib"
    }
    unset lib
}



# $var变量的添加、删除、去重
function PATH::append() {
    local var=$(readlink -f  "$1")
    if [[ -n "$var" ]]; then
        PATH::remove "$var"
        export PATH="$PATH:$var"
    fi
    unset var
}
function PATH::add() {
    local var=$(readlink -f  "$1")
    if [[ -n "$var" ]]; then
        PATH::remove "$var"
        export PATH="$var:$PATH"
    fi
    unset var
}
function PATH::remove() {
    local var=$(readlink -f  "$1")
    if [[ -n "$var" ]]; then
        local temp=$(echo -n "$PATH" | awk -v RS=: -v ORS=: '$0 != "'"$var"'"' | sed 's/:$//')
        export PATH=$temp
        unset temp
        PATH::dedup
    fi
    unset var
}

function PATH::dedup() {
    local temp=$(echo -n $PATH | awk -v RS=: '!($0 in a) {a[$0]; printf("%s%s", length(a) > 1 ? ":" : "", $0)}')
    export PATH=$temp
    unset temp
}











__core_init__




































